package com.school.sports.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Collectors;

/**
 * 志愿者实体类
 * 注意：志愿者是用户的一种角色，该类主要用于扩展用户的志愿者相关属性和方法
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Volunteer {

    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 用户对象（关联查询时使用）
     */
    @TableField(exist = false)
    private User user;

    /**
     * 志愿者申请列表
     */
    @TableField(exist = false)
    private List<VolunteerApplication> applications;

    /**
     * 志愿者任务列表
     */
    @TableField(exist = false)
    private List<VolunteerTask> tasks;

    /**
     * 服务时长（统计字段）
     */
    @TableField(exist = false)
    private Integer totalServiceHours;

    /**
     * 已完成任务数量
     */
    @TableField(exist = false)
    private Integer completedTasksCount;

    /**
     * 当前进行中的任务数量
     */
    @TableField(exist = false)
    private Integer ongoingTasksCount;

    /**
     * 平均评分
     */
    @TableField(exist = false)
    private Double averageRating;

    /**
     * 志愿者状态枚举
     */
    public enum VolunteerStatus {
        ACTIVE("活跃"),
        INACTIVE("非活跃"),
        SUSPENDED("暂停服务");

        private final String displayName;

        VolunteerStatus(String displayName) {
            this.displayName = displayName;
        }

        public String getDisplayName() {
            return displayName;
        }

        /**
         * 根据显示名称获取枚举值
         */
        public static VolunteerStatus fromDisplayName(String displayName) {
            for (VolunteerStatus status : VolunteerStatus.values()) {
                if (status.getDisplayName().equals(displayName)) {
                    return status;
                }
            }
            return null;
        }
    }

    /**
     * 服务类型枚举
     */
    public enum ServiceType {
        VENUE_ASSISTANCE("场地协助"),
        EQUIPMENT_MANAGEMENT("器材管理"),
        PARTICIPANT_GUIDANCE("参赛引导"),
        MEDICAL_SUPPORT("医疗支持"),
        INFORMATION_DESK("咨询服务台"),
        TRANSPORTATION("交通协助"),
        DOCUMENTATION("文档记录"),
        SECURITY("安全保卫"),
        OTHER("其他");

        private final String displayName;

        ServiceType(String displayName) {
            this.displayName = displayName;
        }

        public String getDisplayName() {
            return displayName;
        }

        /**
         * 根据显示名称获取枚举值
         */
        public static ServiceType fromDisplayName(String displayName) {
            for (ServiceType type : ServiceType.values()) {
                if (type.getDisplayName().equals(displayName)) {
                    return type;
                }
            }
            return null;
        }
    }

    /**
     * 获取志愿者姓名
     */
    public String getVolunteerName() {
        return user != null ? user.getRealName() : "未知志愿者";
    }

    /**
     * 获取志愿者学号/工号
     */
    public String getVolunteerNumber() {
        return user != null ? user.getUsername() : "";
    }

    /**
     * 获取联系方式
     */
    public String getContactInfo() {
        if (user != null) {
            return "电话：" + user.getPhone() + " | 邮箱：" + user.getEmail();
        }
        return "联系方式未知";
    }

    /**
     * 获取学院信息
     */
    public String getCollegeInfo() {
        return user != null ? user.getCollege() : "未知学院";
    }

    /**
     * 获取班级信息
     */
    public String getClassInfo() {
        return user != null ? user.getClassName() : "";
    }

    /**
     * 获取志愿者状态（根据任务情况判断）
     */
    public String getVolunteerStatus() {
        if (ongoingTasksCount != null && ongoingTasksCount > 0) {
            return VolunteerStatus.ACTIVE.getDisplayName();
        } else if (completedTasksCount != null && completedTasksCount > 0) {
            return VolunteerStatus.ACTIVE.getDisplayName();
        } else {
            return VolunteerStatus.INACTIVE.getDisplayName();
        }
    }

    /**
     * 获取服务时间统计信息
     */
    public String getServiceStatistics() {
        StringBuilder stats = new StringBuilder();
        stats.append("总服务时长：").append(totalServiceHours != null ? totalServiceHours : 0).append("小时");
        stats.append("，已完成任务：").append(completedTasksCount != null ? completedTasksCount : 0).append("个");
        stats.append("，进行中任务：").append(ongoingTasksCount != null ? ongoingTasksCount : 0).append("个");
        return stats.toString();
    }

    /**
     * 获取专业服务领域
     */
    public List<String> getExpertiseAreas() {
        if (applications == null || applications.isEmpty()) {
            return Collections.emptyList();
        }

        return applications.stream()
                .filter(app -> app.getPreference() != null && !app.getPreference().trim().isEmpty())
                .map(VolunteerApplication::getPreference)
                .distinct()
                .collect(Collectors.toList());
    }

    /**
     * 检查是否为活跃志愿者
     */
    public boolean isActiveVolunteer() {
        return VolunteerStatus.ACTIVE.getDisplayName().equals(getVolunteerStatus());
    }

    /**
     * 检查是否有进行中的任务
     */
    public boolean hasOngoingTasks() {
        return ongoingTasksCount != null && ongoingTasksCount > 0;
    }

    /**
     * 检查是否可以接受新任务
     */
    public boolean canAcceptNewTask() {
        // 可以根据业务规则调整，比如同时进行中的任务数量限制
        return isActiveVolunteer() && (ongoingTasksCount == null || ongoingTasksCount < 3);
    }

    /**
     * 获取志愿者评分星级显示
     */
    public String getRatingDisplay() {
        if (averageRating == null) {
            return "暂无评分";
        }

        int stars = (int) Math.round(averageRating);
        StringBuilder display = new StringBuilder();

        for (int i = 0; i < stars; i++) {
            display.append("⭐");
        }

        display.append(" (").append(String.format("%.1f", averageRating)).append(")");
        return display.toString();
    }

    /**
     * 获取志愿者绩效等级
     */
    public String getPerformanceLevel() {
        if (averageRating == null) {
            return "暂无评级";
        }

        if (averageRating >= 4.5) {
            return "优秀";
        } else if (averageRating >= 3.5) {
            return "良好";
        } else if (averageRating >= 2.5) {
            return "合格";
        } else {
            return "需改进";
        }
    }

    /**
     * 获取志愿者详细信息
     */
    public String getDetailedInfo() {
        StringBuilder info = new StringBuilder();
        info.append("姓名：").append(getVolunteerName()).append("\n");
        info.append("学号：").append(getVolunteerNumber()).append("\n");
        info.append("学院：").append(getCollegeInfo()).append("\n");
        if (getClassInfo() != null && !getClassInfo().trim().isEmpty()) {
            info.append("班级：").append(getClassInfo()).append("\n");
        }
        info.append(getServiceStatistics()).append("\n");
        info.append("绩效评级：").append(getPerformanceLevel()).append("\n");
        info.append("平均评分：").append(getRatingDisplay());
        return info.toString();
    }

    /**
     * 从关联对象同步字段信息
     */
    public void syncFieldsFromObjects() {
        // 如果用户对象存在，可以同步一些基本信息
        if (user != null) {
            // 这里可以添加一些同步逻辑
        }
    }

    /**
     * 检查志愿者信息是否完整
     */
    public boolean isProfileComplete() {
        return user != null
                && user.getRealName() != null && !user.getRealName().trim().isEmpty()
                && user.getPhone() != null && !user.getPhone().trim().isEmpty()
                && user.getCollege() != null && !user.getCollege().trim().isEmpty();
    }

    /**
     * 获取志愿者服务时间趋势
     */
    public String getServiceTrend() {
        if (tasks == null || tasks.isEmpty()) {
            return "暂无服务记录";
        }

        // 这里可以基于任务时间计算服务趋势
        // 简化实现，实际可以按月份统计
        long recentTasks = tasks.stream()
                .filter(task -> task.getStartTime() != null &&
                        task.getStartTime().isAfter(LocalDateTime.now().minusDays(30)))
                .count();

        if (recentTasks >= 5) {
            return "近期活跃";
        } else if (recentTasks >= 2) {
            return "正常参与";
        } else {
            return "参与较少";
        }
    }

    /**
     * 获取推荐任务类型
     */
    public List<String> getRecommendedTaskTypes() {
        if (tasks == null || tasks.isEmpty()) {
            return getExpertiseAreas();
        }

        // 基于历史任务推荐相似类型的任务
        return tasks.stream()
                .filter(task -> task.getTaskContent() != null)
                .map(task -> extractTaskType(task.getTaskContent()))
                .distinct()
                .limit(3)
                .collect(Collectors.toList());
    }

    /**
     * 从任务内容中提取任务类型（简化实现）
     */
    private String extractTaskType(String taskContent) {
        if (taskContent.contains("场地")) return ServiceType.VENUE_ASSISTANCE.getDisplayName();
        if (taskContent.contains("器材")) return ServiceType.EQUIPMENT_MANAGEMENT.getDisplayName();
        if (taskContent.contains("引导")) return ServiceType.PARTICIPANT_GUIDANCE.getDisplayName();
        if (taskContent.contains("咨询")) return ServiceType.INFORMATION_DESK.getDisplayName();
        return ServiceType.OTHER.getDisplayName();
    }

    /**
     * 检查是否为优秀志愿者
     */
    public boolean isOutstandingVolunteer() {
        return averageRating != null && averageRating >= 4.5
                && completedTasksCount != null && completedTasksCount >= 5;
    }

    /**
     * 获取志愿者标签
     */
    public List<String> getVolunteerTags() {
        List<String> tags = getExpertiseAreas();

        if (isOutstandingVolunteer()) {
            tags.add("优秀志愿者");
        }

        if (isActiveVolunteer()) {
            tags.add("活跃志愿者");
        }

        if (hasOngoingTasks()) {
            tags.add("任务进行中");
        }

        return tags;
    }
}